package com.smzd.core.dao;

import java.util.List;

import com.smzd.core.domain.IntIdEntity;
import com.smzd.core.mappers.IMapper;
import com.smzd.core.utils.db.Page;

public abstract class AbstractDao<E extends IntIdEntity> implements IDao<E> {

	protected abstract IMapper<E> getMapper();

	@Override
	public void insert(E elem) {
		getMapper().insert(elem);
	}

	@Override
	public void update(E elem) {
		getMapper().update(elem);
	}

	@Override
	public void remove(E elem) {
		getMapper().remove(elem);
	}

	@Override
	public E getElemById(int id) {
		return getMapper().getElemById(id);
	}

	@Override
	public Page<E> getElemsByPage(Page<E> page) {
		preparePage(page);
		List<E> elems = getMapper().getElemsByPage(page);
		page.setElems(elems);
		int total = getElemsCount(page);
		page.setTotalCount(total);
		completePage(page);
		return page;
	}

	protected static <T extends IntIdEntity> Page<T> preparePage(Page<T> page) {
		int pageNo = page.getPageNo();
		int pageSize = page.getPageSize();
		// 计算开始记录位置并设置。注意：页码从第一页开始，不是0
		int offset = pageSize * (pageNo - 1);
		page.setOffset(offset);
		return page;
	}

	protected static <T extends IntIdEntity> Page<T> completePage(Page<T> page) {
		int totalCount = page.getTotalCount();
		int pageSize = page.getPageSize();
		// 计算总页数
		int pageCount = totalCount / page.getPageSize();
		if (totalCount % pageSize > 0) {
			pageCount++;
		}
		page.setPageCount(pageCount);
		return page;
	}

	@Override
	public int getElemsCount(Page<E> page) {
		int total = getMapper().getElemsCount(page);
		return total;
	}

	@Override
	public Page<E> getAllElems(Page<E> page) {
		if (page.getPageSize() < 9999) {
			page.setPageSize(9999);
		}
		page.setPageNo(1);
		return getElemsByPage(page);
	}

}
